﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Syntezator_mowy.Extras;
using System.Threading;
using Syntezator_mowy.Converter;
using System.IO;
using Syntezator_mowy.SDDBD;
using Microsoft.Speech.Recognition;

namespace Syntezator_mowy
{
    public class Kontroler
    {
        private ISyntezator kontroler;
        private WavToMp3Converter converter;
        public bool endAction { get; set; }
        private SynchrBuffer<InputParameters> pathsBuffer;
        private SynchrBuffer<string> outBuffer;
        private bool conversionStarted;

        private Dictionary<Jezyk, SpeechRecognitionEngine> silniki;

        public bool przetworzono { get; set; }

        public Kontroler(ref SynchrBuffer<InputParameters> pathsBuffer, ref SynchrBuffer<string> przetworzonePliki, Serwer bazaDanych)
        {
            this.outBuffer = new SynchrBuffer<string>();
            this.pathsBuffer = pathsBuffer;

            this.kontroler = new Syntezator(ref this.outBuffer, ref przetworzonePliki);
            this.endAction = false;
            this.conversionStarted = false;

            this.silniki = new Dictionary<Jezyk, SpeechRecognitionEngine>();

            SpeechRecognitionEngine silnikPolski = Sr.Sr.utworzGramatyke(Jezyk.POLSKI, bazaDanych);
            this.silniki.Add(Jezyk.POLSKI, silnikPolski);

            this.przetworzono = false;
        }
        
        public void run(object pathToLame)
        {
            string ptl = pathToLame as string;

            this.converter = new WavToMp3Converter(ptl, ref this.outBuffer);
            Thread converterThread = null;
            if (ptl != null)
            {
                if (File.Exists(ptl))
                {
                    converterThread = new Thread(new ThreadStart(converter.run));

                    converterThread.Start();
                    this.conversionStarted = true;
                }
            }
            while (!endAction)
            {
                InputParameters parameters = this.pathsBuffer.wyciagnij();
                if (parameters != default(InputParameters))
                {
                    przetwarzajElement(parameters);
                    Thread.Sleep(100);
                }
            }
            while (this.pathsBuffer.zwrocIlosc() > 0)
            {
                InputParameters parameters = this.pathsBuffer.wyciagnij();
                przetwarzajElement(parameters);
            }
            this.converter.endAction = true;
            if (this.conversionStarted)
            {
                converterThread.Join();
            }
        }

        private void przetwarzajElement(InputParameters parameters)
        {
            this.przetworzono = false;
            switch (parameters.action)
            {
                case Action.SP:
                    kontroler.przeksztalcNaTekst(parameters.inputString, parameters.outputString, parameters.language, this.silniki[parameters.language]);
                    break;
                case Action.TTS:
                    kontroler.przeksztalcNaGlos(parameters.inputString, parameters.outputString, parameters.language);
                    break;
                default:
                    break;
            }
            this.przetworzono = true;
        }
    }
}